/**
 * @file
 *
 * Modulo per la gestione del file dei records.
 *
 * In questo file viene gestito l'archivio ::RECORDS_INI_FILE (definito in
 * common.h) che contiene i dati relativi ai records delle partite. \n
 * Viene salvato il nome del giocatore ed il tempo migliore per ogni tipo di
 * gliglia in una sezione indicata come [colonne x righe x mine].
 */

// Author: Adrian Sassatelli
// Copyright (c) 2014 Adrian Sassatelli


#include <gtk/gtk.h>
#include <iostream>
#include "records_io.h"
#include "common.h"
#include "debug.h"

using namespace std;


/* -------------------------------------------------------------------------- */

/* Caricamento del record corrente */
gboolean load_current_record (record_data_s *adata, const int acols, const int arows, const int amines) {
    DBG_FUNCNAME ("load_current_record", "legge dati record corrente");

    // Imposto valori iniziali
    g_free (adata->name);
    adata->name = NULL;
    adata->seconds = MAX_COUNTED_TIME;

    // Apri file ini
    GKeyFile *keyfile = g_key_file_new ();    // Crea un nuovo oggetto GKeyFile
    if (g_key_file_load_from_file (keyfile, RECORDS_INI_FILE, G_KEY_FILE_KEEP_COMMENTS, NULL) == true)  {
        DBG_GENERIC ("leggo dati record");

        // Leggi dati
        gchar *v = g_strdup_printf ("%dx%dx%d", acols, arows, amines);    // Calcola nome gruppo
        adata->name = g_key_file_get_string (keyfile, v, INI_KEY_NAME, NULL);    // Leggi nome
        adata->seconds = g_key_file_get_integer (keyfile, v, INI_KEY_SECONDS, NULL);    // Leggi tempo
        g_free (v);

        DBG_GENERIC ("record attuale per " << (adata->name == NULL ? "NULL" : adata->name) << ": " << adata->seconds);
    } else {
        DBG_GENERIC ("problema nell'apertura del file " << RECORDS_INI_FILE);
        DBG_GENERIC ("nessun record attuale");
    }

    g_key_file_free (keyfile);    // Libera oggetti

    return ((adata->name != NULL) && (adata->seconds != 0));    // Ritorna true se valori sono coerenti
}

/* -------------------------------------------------------------------------- */

/* Salvataggio del record corrente */
gboolean save_current_record (record_data_s adata, const int acols, const int arows, const int amines) {
    DBG_FUNCNAME ("load_current_record", "legge dati record corrente");

    GError *error = NULL;

    // Apertura file ed eventuale lettura dati precedenti
    GKeyFile *keyfile = g_key_file_new ();    // Creo handle file
    g_key_file_load_from_file (keyfile, RECORDS_INI_FILE, G_KEY_FILE_KEEP_COMMENTS, NULL);    // Leggo eventuali dati precedenti

    // Memorizzo dati attuali
    gchar *v = g_strdup_printf ("%dx%dx%d", acols, arows, amines);    // Calcola nome gruppo
    g_key_file_set_string (keyfile, v, INI_KEY_NAME, adata.name);    // Scrivi nome
    g_key_file_set_integer (keyfile, v, INI_KEY_SECONDS, adata.seconds);    // Scrivi tempo
    g_free (v);

    gchar *data = g_key_file_to_data (keyfile, NULL, &error); // Converti i dati in formato stringa
    g_key_file_free (keyfile);    // Libera oggetto

    if (error == NULL) {    // Tutto ok?
        DBG_GENERIC ("cerco di scrivere il file");

        if (g_file_set_contents (RECORDS_INI_FILE, data, -1, NULL) == true) {
            DBG_GENERIC ("file scritto correttamente");

            g_free (data);    // Libera oggetto

            return true;
        }
    } else {
        g_error_free (error);    // Libera oggetto
    }

    g_free (data);    // Libera oggetto

    return false;
}

/* -------------------------------------------------------------------------- */
